Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

< Назад, к странице 175
Вперёд, к странице 177 >

Зарезервированные слова, системные переменные и спецсимволы

Операторы

! (комментарий)

! — оператор комментария. То, что находится в строке после оператора комментария, и до конца строки игнорируется интерпретатором. Оператор комментария позволяет "закомментировать" (выключить) ненужный временно оператор / функцию во время отладки игры. Кроме того, написание комментариев к коду программы является одним из признаков хорошего стиля программирования.

Необходимо чётко понимать, что это именно оператор, поэтому если вы комментируете некую строку кода, то ! должен стоять после &:

    *pl "Hello, world!" & ! комментарий

Комментарии могут быть однострочными, то есть заканчиваться в той же строке, где стоит оператор комментария:

    ! однострочный комментарий
    *pl "строка текста" & ! тоже однострочный комментарий

Комментарии могут быть многострочными. Для этого после оператора комментария нужно записать кавычки, апострофы, или фигурные скобки. Например так:

    ! "это первая строка коммантария
        это вторая строка комментария
        это третья строка комментария
    "

Многострочные комментарии могут принимать самые разнообразные формы:

    ! строка до  кавычек " текст внутри кавычек
    может переходить на другие строки " а так же {
    можно использовать другие группы символов, чтобы 
    продолжать многострочный комментарий
    } и комментарий не кончится, пока не кончится строка

*CLEAR (*CLR)

*CLEAR — очищает окно основного описания. Имеет краткую форму *clr.

*NL

*NL — переход на новую строку, затем вывод текста в окне основного описания. Общая запись:

        *NL [$текст]

, где [$текст] — любая строка текста, число, или выражение любого типа. Если [$текст] отсутствует, происходит просто переход на новую строку. Пример:

    *p "Текст без перехода на новую строку."
    *nl "Переход на новую строку + выведение текста."
    *p "Текст без перехода на новую строку."

*P

*P — вывод текста в окно основного описания без перехода на новую строку. Вывод текста любым другим оператором сразу после *p добавит новый текст сразу после текущего. Общая запись:

        *P [$текст]

, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может быть пустой строкой '', но не должен отсутствовать. Пример:

    *p "Текст без перехода на новую строку."
    *p "Текст без перехода на новую строку."
    *p ""
    *p "Текст без перехода на новую строку."

*pl

*PL — вывод текста в окно основного описания, затем переход на новую строку. Общая запись:

    *PL [$текст]

, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может отсутствовать, тогда просто переход на новую строку. Пример:

    *pl "Вывод текста, затем переход на новую строку."
    *pl "Вывод текста, затем переход на новую строку."
    *p "Текст без перехода на новую строку."
    *pl "Вывод текста, затем переход на новую строку."

Аналогичным образом можно вывести текст, просто написав нужное выражение вместо данного оператора. Например, строки:

    *pl $AAA+'989'
    *pl 'Вы находитесь в парке'
    *pl 'Преформатированная

        строка'

и:

    $AAA+'989'
    'Вы находитесь в парке'
    'Преформатированная

        строка'

сработают одинаково.

ACT

ACT — создаёт и выводит в окно действий новое действие.

Общая запись в однострочной форме:

    ACT [$название], [$путь к файлу изображения]: [оператор] & [оператор] & [оператор]

Общая запись в многострочной форме:

    ACT [$название], [$путь к файлу изображения]:
        [оператор]
        [оператор]
        [оператор]
    END

К списку действий в окне действий добавляется новое с названием [$название] и изображением, которое лежит по пути [$путь к файлу изображения]. При нажатии на действие выполняются заданные операторы.

Параметр [$путь к файлу изображения] может отсутствовать, при этом действие добавится без изображения.

Примеры:

    ! действие в однострочной форме записи
    act "Сорвать с берёзы яблоко": яблоко+=1 & *pl "Вы сорвали яблоко, спелое белое."

    ! действие в многострочной форме записи, с изображением
    act "Сорвать арбуз с куста","img/watermelon.png":
        арбуз+=1
        *pl "Вы сорвали арбуз с куста"
    end

Если в списке действий уже есть действие с указанным названием, то новое действие не создаётся, и не заменяет собой уже существующее, плеер просто игнорирует команду act. Таким образом нельзя вывести действия с одинаковыми названиями. Пример:

    act "Действие 1": *pl "Старое действие."
    act "Действие 1": *pl "Новое действие."

Однако, вы можете сымитировать действия с одинаковыми названиями в режиме распознавания HTML, добавив в названия действий несуществующий HTML-тег:

    usehtml=1
    act "Действие 1<uid-old>": *pl "Старое действие."
    act "Действие 1<uid-new>": *pl "Новое действие."

ADDOBJ

ADDOBJ — добавление нового предмета в окно предметов. Общая запись:

    ADDOBJ [$название],[$путь к файлу изображения],[#позиция]

, где [$название] — это название предмета, [$путь к файлу изображения] — это путь к файлу изображения предмета (отображается рядом с названием предмета), а [#позиция] — на какое место в инвентаре добавляется предмет. Параметр [#позиция] может отсутствовать. По умолчанию предметы добавляются в конец списка. Нумерация предметов в инвентаре ведётся с 1. Параметр [$путь к файлу изображения] может отсутствовать, значение по умолчанию - '', при этом предмет добавляется без изображения.

Допускается, но не рекомендуется, запись:

    ADD OBJ [$название],[$путь к файлу изображения],[#индекс]

Можно добавлять предметы с одинаковым названием, однако если вы планируете добавлять много одинаковых предметов, то лучше использовать дополнительную переменную для подсчёта этих предметов, а в окно предметов добавить один предмет, чтобы не загромождать инвентарь списком из 137 предметов Рубль / Патрон:

    if obj 'Патроны':
    ! если предмет "Патроны" уже добавлен, просто увеличиваем их число
        патроны=патроны+10
    else
    ! если предмет "Патроны" ещё не добавлен, добавляем, и увеличиваем число
        addobj 'Патроны'
        патроны=патроны+10
    end

Для хранения числа предметов можно использовать массивы, индексируемые через строки:

    objects['деньги'] = 12
    objects['патроны'] = 137
    'Количество: <<objects[$getobj(countobj)]>>'

Пример добавления предмета в самый верх списка (при этом все остальные предметы сместятся вниз):

    addobj "Отвёртка","",1

ADDQST (INCLIB)

ADDQST — из заданного файла игры добавляет все локации, названия которых отсутствуют среди текущих игровых локаций. Загруженные локации полностью эквивалентны локациям из основного файла игры. Общая запись:

    ADDQST [$путь к файлу игры]

В более новых версиях библиотеки команда переименована в addlib (нигде не использовалось), затем в inclib (использовалась в Quest Navigator и будет использоваться в плеерах с библиотекой версии 5.8.0 и выше).

Пример:

    addqst "lib/easy.math.qsp"
    addqst "lib/easy.title.qsp"
    addqst "res/drive.qsp"
    addqst "res/base.qsp"
    addqst "res/intro.qsp"

CLA

CLA - очистка списка текущих действий (удаление всех действий из окна действий).

CLEAR (CLR)

CLEAR — очищает окно дополнительного описания. Имеет краткую форму clr.

CLOSE

CLOSE — останавливает проигрывание указанного звукового файла. Общая запись:

    CLOSE [$путь к звуковому файлу]

, где [$путь к звуковому файлу] — путь к звуковому файлу относительно файла игры. Если параметр [$путь к звуковому файлу] не указан, происходит остановка воспроизведения всех звуковых файлов.

CLOSE ALL

CLOSE ALL — остановка проигрывания всех активных звуковых файлов. Имеет краткую форму close.

CLS

CLS — очищает все окна кроме списка предметов. Эквивалентно конструкции:

    clear & *clear & cla & cmdclear

CMDCLEAR (CMDCLR)

CMDCLEAR — очистка строки ввода. Имеет краткую форму cmdclr.

COPYARR

COPYARR — копирование содержимого одного массива в другой. Общая запись:

    COPYARR [$приёмник],[$источник],[#начало],[#количество]

, где: [$приёмник] — это массив, в который производится копирование, размер и наполнение значения не имеют; [$источник] — это массив, из которого производится копирование; [#начало] — номер элемента, с которого нужно начинать копирование; [#количество] — сколько элементов нужно скопировать. Параметр [#количество] является необязательным; по умолчанию — до конца массива-источника. Параметр [#начало] является необязательным; по умолчанию — 0.

Примеры:

    ! копируем все элементы массива '$b' в массив '$a'
    copyarr '$a','$b'
    ! при этом так же были скопированны все элементы массива 'b' в массив 'a'

    ! копируем в массив 'c' элементы массива 'd', начиная с шестого
    copyarr 'c','d',6

    ! копируем шесть первых элементов массива 'd' в массив 'c'
    copyarr 'c','d',0,6

В силу особенностей плеера при копировании, например, числового массива mass1 в mass2 копируется также текстовый массив $mass1 в $mass2.

Другие примеры:

    copyarr $arrname1,$arrname2,10,5
    copyarr 'a<<$arrname1>>','a<<$arrname2>>'

DELACT

DELACT — удаляет действие из списка действий (если такое действие существует). Общая запись:

    DELACT [$название]

, где [$название] — название действия, которое хотим удалить.

Примеры:

    ! удаляем действие с конкретным названием
    delact 'Идти вперед'
    ! удаляем выделенное действие
    delact $selact

Допустима, но не одобряется, форма записи:

    DEL ACT [$название]

DELOBJ

DELOBJ — удаление предмета из инвентаря по названию (если такой предмет существует). Общая запись:

    DELOBJ [$название]

, где [$название] — название предмета, который хотим удалить.

Если в инвентаре присутствуют одинаковые предметы, команда удалит самый верхний с указанным индексом.

Примеры:

    ! удаляем предмет с конкретным названием
    delobj "Отвёртка"
    ! удаляем выделенный предмет
    delobj $selobj

Допустима, но не одобряется, форма записи:

    DEL OBJ [$название]

DYNAMIC

DYNAMIC — выполняет код, переданный в виде строки текста. Общая запись:

        DYNAMIC([$код],[аргумент 0],[аргумент 1], ... ,[аргумент 8])

, где [$код] — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода оператора GOSUB. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться внутри [$код], их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. После выполнения старые параметры args восстанавливаются, затем продолжается выполнение кода со следующей команды после dynamic.

Примеры:

    dynamic '$a="string<<$b>>"'
    dynamic '$a'
    dynamic 'if $a="string":''text!'''
    dynamic "
        $args[0]
        addobj $args[1]
    "
,'Текст','Вилка'

Нижеследующая информация справедлива и для функции dyneval (см. соответствующий раздел).

Важно! Если код задан с помощью одинарных ('') или двойных ("") кавычек, в тексте вычисляются подвыражения:

    $args[0]='qwerty'
    $code = '
        *pl "<<$args[0]>>"
        *pl $args[0]
    '

    $args[0]='12345'
     
    dynamic $code,'asdfg'

В этом случае при задании переменной $code будет вычислено подвыражение, поэтому первой строкой выведется 'qwerty', второй строкой выведется 'asdfg'.

Фигурные скобки - третий вид кавычек используемый специально для написания динамического кода. Здесь поддерживается вложенность скобок, а перед выполнением кода не вычисляются подвыражения:

    $args[0]='qwerty'
    $code = {
        *pl "<<$args[0]>>"
        *pl $args[0]
    }

    dynamic $code,'asdfg'

В этом случае будут выведены две строки 'asdfg'.

EXIT

EXIT — завершение выполнения текущего блока кода (преждевременный выход из подпрограммы, функции, обработчика какого-либо события, и т.д.).

В качестве блока кода может выступать локация, действие, код, переданный dynamic'у или dyneval'у, или код в гиперссылке.

Пример:

    if args[1] = 0:
        exit
    else
        if args[0] mod args[1]=0:
            result=-1
        else
            result=0
        end
    end

Внимание!!! В более новых версиях плеера (5.8.0 и выше) есть оператор цикла loop, и тело цикла так же считается отдельным блоком кода, однако оператор exit прерывает не только сам цикл, но и блок кода, в котором находится цикл.

GOSUB (GS)

GOSUB — выполнение кода указанной локации без непосредственного перехода на неё.

Общая запись:

    GOSUB [$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8]

, где [$локация] — это название локации, код которой мы хотим выполнить без непосредственного перехода на неё. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. После обработки локации предыдущие значения args восстанавливаются. Использование аргументов не обязательно.

При обращении к локации по gosub базовое описание локации добавляется к текущему описанию, базовые действия добавляются к текущим действиям, и происходит выполнение операторов в поле "Выполнить при посещении", затем возврат на исходную строку (продолжение выполнения кода после gosub).

Примеры вызова локаций по gosub:

    !обработка локации "ход". Массив args[] пуст.
    gosub 'ход'
    
    !обработка локации с названием из переменной $loc
    !Передаётся один параметр - args[0] равен 1.
    gosub $location,1
    
    !обработка локации "ход" с передачей 3-х параметров. 
    ! $args[0] = $var (значению), args[1] = 2, 
    ! $args[2] = "данные". Обратите внимание на символы '$'.
    gosub 'ход',$var,2,'данные'

Ещё пример:

    ! это код вызова локации "переход"
    gosub 'переход', 'локация'

    ! а это код самой локации "переход"
    # переход
    *pl $args[0]  & ! на экран выведется текст 'локация'
    ! в окне действий появится новое действие:
    act 'перейти':
        goto "улица"
    end
    - переход

Оператор имеет краткую форму gs:

    GS [$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8]

GOTO (GT)

GOTO — переход на указанную локацию. Общая запись:

    GOTO [$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8]

, где [$локация] — название локации, на которую должен быть осуществлён переход. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. Использование аргументов не обязательно.

При переходе на новую локацию при помощи goto очищается окно основного описания, а также список текущих действий, затем в окно основного описания выводится текст базового описания, в окно действий — базовые действия, а так же выполняется код из поля "Выполнить при посещении" локации [$локация]. Так же при переходе на новую локацию изменяется значение, возвращаемое функцией $curloc.

Примеры:

    ! переход на локацию "дом".
    ! Массив args на локации "дом" будет пуст.
    goto 'дом'

    ! переход на локацию "улица" с передачей 2-х параметров.
    ! на локации "улица" args[0] равен 1,
    ! $args[1] содержит строку "данные".
    goto 'улица',1,'данные'

Оператор имеет краткую форму gt:

    GT [$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8]

IF (ELSE, ELSEIF)

IF — оператор условия. Собственно для того и нужен, чтобы проверять выполнение какого-либо условия. Имеет несколько форм записи.

Простая однострочная форма записи:

    IF [#выражение]: [команда 1] & [команда 2] & ...

Как видите, за ключевым словом if следует выражение [#выражение], и если это выражение верно, тогда выполняется набор команд [команда 1], [команда 2], и т.д., которые записаны после двоеточия в той же строке. При этом команды перечисляются через амперсанд (&).

Именно по наличию команд сразу в той же строке после двоеточия плеер определяет, что это однострочная форма, и считает конец этой строки концом конструкции условия.

Примеры:

    ! если сумма a и b равна двум,
    ! переменной c присваивается значение 30
    if a+b=2: c=30
    ! Если в инвентаре нет апельсина, выводится текст
    if no obj "Апельсин": pl "У Вас нет апельсина."
    ! это тоже простая однострочная форма
    if ((a+b)/c)=45+54 or (b<5 or c>45) and no obj 'лопата' and $f=$vvv+'RRRRR': p 'OK' & goto 'Next'

Сложная однострочная форма записи:

    IF [#выражение]: [команда д1] & [команда д2] & ... ELSE [команда н1] & [команда н2] & ...

Здесь снова за ключевым словом if следует [#выражение], истиность которого требуется проверить. Если выражение верно, выполняется набор команд [команда д1], [команда д2] и т.д., от двоеточия до ключевого слова else. В противном случае, если выражение [#выражение] неверно, выполняется набор команд [команда н1], [команда н2] и т.д., от else и до конца строки. Точно так же, как и для простой однострочной формы, концом конструкции условия считается конец строки.

Примеры сложной однострочной формы:

    ! если сумма a и b равна двум, переменной c присваивается значение 30
    ! в противном случае (то есть если сумма a и b не равна двум)
    ! переменной c присваивается значение 10
    if a+b=2: c=30 else c=10
    ! в зависимости от того есть ли в инвентаре апельсин
    ! выводится соответствующий текст
    if obj "Апельсин": pl "У Вас есть апельсин." else pl "У Вас нет апельсина."

Простая многострочная форма записи в общем виде выглядит вот так:

    IF [#выражение]:
        [команда 1]
        [команда 2]
        ...
    
END

Как видите, она отличается от простой однострочной формы записи тем, что команды [команда 1], [команда 2] и т.д. записаны не сразу после двоеточия, а только в следующей строке. Именно так плеер понимает, что имеет дело с многострочной формой записи. Наличие или отсутствие пробелов или символов табуляции перед командами роли не играет, однако, чтобы плеер понял, где заканчивается конструкция условия, в конце на отдельной строке необходимо прописывать ключевое слово end, или end if.

Примеры:

    if библиотека = 0:
        узнал_о_тусовке = 0
        библиотека_вернулся = 1
        gt 'библиотека'
    end

    if a+b=2:
        c=30
    end

Сложная многострочная форма в общей записи выглядит вот так:

    IF [#выражение]:
        [команда д1]
        [команда д2]
        ...
    
ELSE
        [команда н1]
        [команда н2]
        ...
    
END

Здесь так же комнады [команда д1], [команда д2] и т.д. записываются не сразу после двоеточия, а только в следующей строке. Ключевое слово else так же записывается в отдельной строке, и команды [команда н1], [команда н2] и т.д. идут в последующих строках после else. Завершается конструкция условия ключевым словом end (или end if), которое снова идёт отдельной строкой.

При верности выражения [#выражение] выполняется набор команд между двоеточием и else, а если [#выражение] неверно, выполняется набор команд между else и end.

Примеры:

    if a+b=2:
        c=30
    else
        c=10
    end
    
    if obj "Апельсин":
        pl "У Вас есть апельсин."
    else
        pl "У Вас нет апельсина."
    end

    if len($curtoken) > 0:
        $tokens[curtoken] = $curtoken
        tokens = curtoken + 1
    else
        tokens = curtoken
    end

Ещё одна форма записи работает только в многострочном варианте (обещали исправить в новых версиях). Это расширенная форма. Она позволяет размещать на одном уровне вложенности последовательно-исключающие условия. Общая форма записи такая:

    IF [#выражение 1]:
        [набор команд 1]
        ...
    
ELSEIF [#выражение 2]:
        [набор команд 2]
        ...
    
ELSEIF ... :
        ...
    
ELSE
        [последний набор команд]
        ...
    
END

Правила записи такие же, как и для других видов многострочных условий. После двоеточия в той же строке, где находится оператор if или elseif не должно идти никаких команд, только со следующей строки. Вся конструкция должна заканчиваться оператором end (или end if), стоящим в отдельной строке. В конструкции может как присутствовать, так и отсуствовать часть с else.

Работает это следующим образом. Если [#выражение 1] верно, выполняются команды [набор команд 1]. Если [#выражение 1] неверно, но верно [#выражение 2], выполняются команды [набор команд 2], и т.д. И только если неверны все выражения в текущей конструкции условия, выполнятся команды после else.

Как вы понимаете, верность выражения [#выражение 1] не исключает верности выражения [#выражение 2], однако верность выражения [#выражение 2] исключает верность выражения [#выражение 1]. Поэтому я и назвал эту конструкцию конструкцией последовательно-исключающих условий.

Примеры:

    IF ОЧКИ>124:
        GOTO 'КОН3'
    ELSEIF ОЧКИ>99:
        GOTO 'КОН4'
    ELSE
        GOTO 'КОН5'
    END
    if money mod 10=1 and money mod 100<>11:
        *pl "У вас <<money>> монета."
    elseif money mod 10>1 and money mod 10<5 and (money mod 100<5 or money mod 100>20):
        *pl "У вас <<money>> монеты."
    elseif money mod 10=0 or money mod 10>4 or (money mod 100>10 and money mod 100<21):
        *pl "У вас <<money>> монет."
    end

Обратите внимание. Ключевым словом end заканчивается не каждый отдельный elseif, а вся конструкция условия.

Для многострочных форм записи допускается вложенность неограниченной глубины. Каждый уровень вложения должен заканчиваться своей строкой end.

Примеры:

    if a+b<3 or y=8:
        p 'A+B<3 или Y=8'
        nl 
        if j=88: nl & p 'NEXT' 
        if $h='ooo':
            p 'loo' & jump 'lll'
        end
    end
    if a=0:
        'abc1234'
        if b=0: '0' else '1'
        if j=88: nl & p 'NEXT'
        if $h='ooo':
            p 'loo' & jump 'lll'
        else
            p 'sample text'
            v=8
        end
        1234
    else
        '01234'
        g=78
    end

Несколько примеров неверной записи:

    ! в этом случае, если условие не будет выполнено,
    ! плеер проигнорирует только команду `k1=34`
    ! поскольку посчитает, что это однострочное условие
    if abcd=3: k1=34
        k2=35 & ! эта команда будет выполняться всегда
        k3=36 & ! эта комнада будет выполняться всегда
    end & ! этот end будет проигнорирован
    ! данная строка выведет ошибку неизвестное действие
    ! так как однострочные формы записи не должны оканчиваться end`ом
    if abcd=3: k1=34 else k1=25 end

    ! данная запись приведёт к ошибке:
    ! "Неверная запись однострочного оператора"
    if absd=3:
        k=34
    else if absd=6:
        k1=25
    end

JUMP

JUMP — переход в текущем блоке кода на указанную метку. Общая запись:

    JUMP [$метка]

, где [$метка] — это метка ниже или выше по коду (см. раздел "Метки").

jump находит метку только в пределах текущего блока кода, то есть метки локальны.

Отдельными блоками кода в QSP являются:

Пример:

    jump 'КонеЦ'
    p 'Это сообщение не будет выведено'
    :конец
    p 'А это сообщение пользователь увидит'

С помощью оператора jump можно организовывать циклы:

    :loop
    if s<9:
        s=s+1
        pl s
        jump 'loop'
    end
    p 'Всё!'

Двойной цикл с одной меткой:

    :loop
    if y<9:
        if x<9:
            *p "<<x>> - "
            x=x+1
            jump 'loop'
        end
        *pl ":<<y>>"
        y=y+1
        x=0
        jump 'loop'
    end

KILLALL

KILLALL — уничтожает все переменные и удаляет все предметы из окна предметов. Эквивалентен конструкции:

    killvar & killobj

Обратите внимание, killall не эквивалентен конструкции:

    killobj & killvar

поскольку в этом случае значения переменных удаляются после удаления предметов, а значит код локации-обработчика удаления предметов успевает выполниться (см. $onobjdel).

Обычно killall используют в начале игры, если в конце игры предусмотрено действие "Начать заново".

KILLOBJ

KILLOBJ — удаление предмета, расположенного в заданной позиции. Общая запись:

    KILLOBJ [#номер]

, где [#номер] — номер предмета в окне инвентаря. Нумерация предметов начинается с 1. Если параметр [#номер] не указан, удаляются все предметы. При удалении каждого предмета с помощью killobj, происходит выполнение кода локации-обработчика удаления предметов (см. $onobjdel).

Пример:

    ! удаляем самый верхний предмет в списке
    killobj 1
    ! удаляем самый нижний предмет в списке
    killobj countobj
    ! удаляем все предметы
    killobj

KILLQST

KILLQST — удаляет все локации, добавленные с помощью оператора addqst. В более новых версиях библиотеки команда переименована в dellib, затем в freelib.

KILLVAR

KILLVAR — удаление указанного элемента массива. Общая запись:

    KILLVAR [$название массива],[#индекс элемента]

, где [$название массива] — название массива, из которого хотим удалить элемент, а [#индекс элемента] — номер элемента в массиве, который хотим удалить. Нумерация элементов массивов начинается с 0.

Если индекс элемента не указан, то очищается весь массив. Если оператор вызван без аргументов, то удаляются все переменные и массивы.

Примеры:

    killvar 'a',3 & ! удалит из массива 'a' элемент с индексом 3.
    killvar 'a' & ! удаляет массив 'a'
    killvar & ! удаляет все переменные, массивы

При удалении элемента все следующие за ним элементы сдвигаются на позицию вверх.

Пример:

    a[0]=4
    a[1]=3
    a[2]=23
    a[3]=15
    KILLVAR 'a',1
    ! теперь массив выглядит так:
    ! a[0]=4
    ! a[1]=23
    ! a[2]=15

LET

LET — устаревший оператор для установки значения переменной. Общая запись:

    LET [название переменной]=[выражение]

, где [название переменной] — это допустимое имя переменной, [выражение] — это допустимое для данной переменной значение.

Названия числовых переменных записываются без символа $ в начале. Названия текстовых переменных записываются с символом $ в начале. Примеры:

    ! задаём текстовую переменную
    let $text="text string"
    ! задаём числовую переменную
    let abs=123

Данный оператор является устаревшим, как и оператор set, поскольку в настоящее время значение переменной устанавливается через присвоение:

    $text="text string"

Использование операторов set и let не рекомендуется.

MENU

MENU — в любом месте игры выводит на экран всплывающее меню, пункты которого прописаны в указанном массиве. Общая запись:

    MENU [$название массива]

Прежде, чем использовать данный оператор, необходимо заполнить массив, на основе содержимого которого будут формироваться пункты меню. Пункты меню — это строковые начения массива с особым форматом записи:

    "название пункта меню:название локации:путь к файлу иконки"

Название пункта меню — это то, что мы увидим на экране, когда меню будет выведено; название локации — это название локации, код которой будет выполняться при щелчке на соответствующем пункте меню; путь к файлу иконки — это путь к файлу изображения, которое будет выведено рядом с названием пункта меню.

Таким образом мы можем заполнить массив для того, чтоб создать наши пункты меню:

    $stone[0]='Взять камень:takestone'
    $stone[1]='Кинуть камень:throwstone'
    $stone[2]='Осмотреть камень:lookstone'

Поиск символов ":" начинается с конца строки, то есть название пункта меню может содержать двоеточия, однако тогда обязательно после названия локации должно стоять двоеточие, даже если вы не используете иконки для пунктов меню.

Если путь к файлу иконки не указан или указанный файл недоступен, то пункт меню отобразится без иконки.

Здесь название массива ($stone) - это название меню, а текстовые значения массива - действия, для которых указаны названия и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "Взять камень" произойдёт обработка локации с названием "takestone". Аналогично будет происходить с другими пунктами.

Чтобы вызвать меню на экран нужно воспользоваться оператором menu:

    menu '$stone'

Меню можно вызывать в любом месте игры, например, из гиперссылок:

    '<a href="EXEC: menu ''$stone''">Камень</a>'

В локацию-обработчик выбора пункта меню передаётся аргумент (args[0]) - позиция выбранного пункта. Позиции элементов меню нумеруются с 1.

Пример создания меню с иконками:

    ! нет иконки
    $usr_menu[0] = 'Взять предмет:take_item'
    ! иконка задана gif-файлом
    $usr_menu[1] = 'Положить предмет:put_item:images/put_item.gif'
    ! иконка задана значением $icon_file
    $usr_menu[2] = 'Осмотреть предмет:look_item:<<$icon_file>>'
    ! пункт меню задан 3-мя переменными
    $usr_menu[3] = '<<$name>>:<<$location>>:<<$file>>'
     
    menu 'usr_menu' &! покажет меню из 4-х пунктов

Меню заканчивается на элементе массива со значением '' (пустая строка). Т.е. если массив меню состоит из элементов 'Взять','Осмотреть','','Бросить', то 2 последних пункта меню не будут созданы:

    $usr_menu[0]='Взять предмет:take_item' & ! этот пункт мы увидим на экране
    $usr_menu[1]='Осмотреть предмет:look_item' & ! и этот пункт мы увидим на экране
    $usr_menu[2]='' & ! здесь пустое значение, плеер посчитает, что меню кончилось
    $usr_menu[3]='Положить предмет:put_item' & ! этот пункт мы не увидим

Чтобы вставить разделитель в меню, вместо соответствующего элемента массива напишите "-:-". Т.е. если нужно поставить разделитель вместо 3-го элемента:

    $usr_menu[0]='Взять предмет:take_item'
    $usr_menu[1]='Осмотреть предмет:look_item'
    $usr_menu[2]='-:-'
    $usr_menu[3]='Положить предмет:put_item'

MSG

MSG — вывод указанного сообщения в диалоговом окне. Общая запись:

    MSG [сообщение]

, где [сообщение] — любая строка текста. число, выражение любого типа. Примеры:

Примеры:

    ! простой вывод сообщения.
    msg 'Много спелых груш.'
    ! получим окно с сообщением 'Много спелых груш'
    ! Пример сообщения в действии ACT.
    act 'Поесть груш':
       msg 'Ммм груши очень вкусные.'
    end
    ! Получим вывод сообщения при клике по действию "Поесть груш"
    !Пример с условием.
    if $hlebgotov = 1:
        msg 'Похоже хлеб уже готов.'
    end
    ! Получаем вывод сообщения когда условие $hlebgotov = 1

NL

NL — переход на новую строку, затем вывод текста в окне основногодополнительного описания. Общая запись:

    NL [$текст]

, где [$текст] — любая строка текста, число, или выражение любого типа. Если [$текст] отсутствует, происходит просто переход на новую строку. Пример:

    p "Текст без перехода на новую строку."
    nl "Переход на новую строку + выведение текста."
    p "Текст без перехода на новую строку."

OPENGAME

OPENGAME — загрузка указанного файла состояния игры. Общая запись:

    OPENGAME [$путь]

, где [$путь] — путь к файлу сохранённого состояния игры. Если параметр [$путь] отсутствует, то вызывается окно загрузки состояния игры.

Пример:

    ! загрузка состояния из файла 1.sav
    opengame "1.sav"
    ! открываем окно загрузки состояния
    opengame

См. также локацию-обработчик события загрузки состояния игры ($ongload).

OPENQST

OPENQST — открытие и запуск указанного файла игры. Общая запись:

    OPENQST [$путь]

, где [$путь] — путь к файлу игры, который требуется запустить. Пример:

    openqst "gamespool/cubesgame.qsp"

При использовании данного оператора, не происходит удаления переменных, удаления предметов инвентаря, очистки дополнительного описания и строки ввода, а также остановки проигрываемых файлов. Если вам нужно очистить экран и значения всех переменных, можно прописать в начале загружаемого файла игры такие команды:

    killall & cls & close all

P

P — вывод текста в окно основного описания без перехода на новую строку. Вывод текста любым другим оператором сразу после p добавит новый текст сразу после текущего. Общая запись:

    P [$текст]

, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может быть пустой строкой '', но не должен отсутствовать. Пример:

    p "Текст без перехода на новую строку."
    p "Текст без перехода на новую строку."
    p ""
    p "Текст без перехода на новую строку."

PL

PL — вывод текста в окно основного описания, затем переход на новую строку. Общая запись:

    PL [$текст]

, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может отсутствовать, тогда просто переход на новую строку. Пример:

    pl "Вывод текста, затем переход на новую строку."
    pl "Вывод текста, затем переход на новую строку."
    p "Текст без перехода на новую строку."
    pl "Вывод текста, затем переход на новую строку."

PLAY

PLAY — проигрывание указанного звукового файла с заданной громкостью. Общая запись:

    PLAY [$путь к звуковому файлу],[#громкость]

, где [$путь к звуковому файлу] — путь к звуковому файлу относительно файла игры, [#громкость] — громкость воспроизведения в процентах от 0 до 100. Параметр [#громкость] может отсутствовать, при этом громкость принимается равной 100%. Примеры:

    !Громкость 100%
    play 'sound/music.mp3'
    !Громкость 50%
    play 'sound/music.mp3',50
    !Громкость 0% (без звука)
    play 'sound/music.mp3',0
    !Проигрывание файла по адресу из переменной $file
    ! с расширением 'mid'
    ! и громкостью volume
    $file="melody"
    play '<<$file>>.mid',volume
    ! аналогично:
    $file="melody.mid"
    play $file,volume

Если файл уже проигрывается, то изменяется громкость звучания без его "перезапуска". Поддерживается множество различных аудиоформатов и одновременное звучание до 32-х композиций.

REFINT

REFINT — принудительное обновление интерфейса (в т.ч. смена цветов, шрифтов, назначенных с помощью системных переменных).

По умолчанию обновление интерфейса происходит 2 раза в секунду (каждые 500 мс). Так же см. оператор settimer.

SAVEGAME

SAVEGAME — сохранение состояния игры в указанный файл. Общая запись:

    SAVEGAME [$путь]

, где [$путь] — путь к создаваемому файлу сохранения состояния игры. Если параметр [$путь] отсутствует, то вызывается окно сохранения состояния игры.

Пример:

    ! сохранение состояния в файл 1.sav
    savegame "1.sav"
    ! открываем окно сохранения состояния
    savegame

См. также локацию-обработчик события сохранения состояния игры ($ongsave).

SET

SET — устаревший оператор для установки значения переменной. Общая запись:

    SET [название переменной]=[выражение]

, где [название переменной] — это допустимое имя переменной, [выражение] — это допустимое для данной переменной значение.

Названия числовых переменных записываются без символа $ в начале. Названия текстовых переменных записываются с символом $ в начале. Примеры:

    ! задаём текстовую переменную
    set $text="text string"
    ! задаём числовую переменную
    set abs=123

Данный оператор является устаревшим, как и оператор let, поскольку в настоящее время значение переменной устанавливается через присвоение:

    $text="text string"

Использование операторов set и let не рекомендуется, так как они устарели.

SETTIMER

SETTIMER — задаёт интервал обращения к локации-счётчику. Общая запись:

    SETTIMER [#выражение]

, где [#выражение] — период обращения к локации-счётчику в миллисекундах. По умолчанию плеер обращается к локации-счётчику каждые 500 мс., т.е. 2 раза в секунду.

Установка периода обращения к локации-счётчику влияет и на частоту автоматического обновления настроек интерфейса.

Примеры:

    ! локация-счётчик будет запускаться каждые 2 секунды:
    settimer 2000
    ! локация-счётчик будет запускаться 4 раза в секунду:
    settimer 250
    ! если мы задаём частоту обращения (раз в секунду)
    frequency=10 & ! десять раз в секунду
    settimer 1000/frequency
    ! если мы задаём период обращения (через сколько секунд)
    period=2 & ! каждые две секунды
    settimer 1000*period

Минимальное значение периода таким образом может быть 1 миллисекунда:

    settimer 1

Однако на практике минимальное значение ограничено мощностью вашего компьютера, и оно, как правило, выше 1 миллисекунды.

SHOWACTS

SHOWACTS — управляет отображением окна действий на экране. Общая запись:

    SHOWACTS [#выражение]

, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, окно действий отображается. Если значение выражения [#выражение] равно нулю, окно действий скрыто. Примеры:

    showacts 1 & ! показывает список действий
    showacts 0 & ! скрывает список действий

Для удобства чтения кода можно заранее определить переменные on и off и использовать их:

    on=1
    off=0
    showacts on & ! показывает список действий
    showacts off & ! скрывает список действий

SHOWINPUT

SHOWINPUT — управляет отображением строки ввода на экране. Общая запись:

    SHOWINPUT [#выражение]

, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, строка ввода отображается. Если значение выражения [#выражение] равно нулю, строка ввода скрыта. Примеры:

    showinput 1 & ! показывает строку ввода
    showinput 0 & ! скрывает строку ввода

Для удобства чтения кода можно заранее определить переменные on и off и использовать их:

    on=1
    off=0
    showinput on & ! показывает строку ввода
    showinput off & ! скрывает строку ввода

SHOWOBJS

SHOWOBJS — управляет отображением инвентаря на экране. Общая запись:

    SHOWOBJS [#выражение]

, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, инвентарь отображается. Если значение выражения [#выражение] равно нулю, инвентарь скрыт. Примеры:

    showobjs 1 & ! показывает инвентарь
    showobjs 0 & ! скрывает инвентарь

Для удобства чтения кода можно заранее определить переменные on и off и использовать их:

    on=1
    off=0
    showobjs on & ! показывает инвентарь
    showobjs off & ! скрывает инвентарь

SHOWSTAT

SHOWSTAT — управляет отображением окна дополнительного описания на экране. Общая запись:

    SHOWSTAT [#выражение]

, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, окно дополнительного описания отображается. Если значение выражения [#выражение] равно нулю, окно дополнительного описания скрыто. Примеры:

    showstat 1 & ! показывает окно дополнительного описания
    showstat 0 & ! скрывает окно дополнительного описания

Для удобства чтения кода можно заранее определить переменные on и off и использовать их:

    on=1
    off=0
    showstat on & ! показывает окно дополнительного описания
    showstat off & ! скрывает окно дополнительного описания

UNSELECT (UNSEL)

UNSELECT — отмена выделения предмета. Имеет краткую форму unsel.

При щелчке играющим по какому-либо предмету, он остаётся выделенным. Чтобы снять выделение с предмета используется данный оператор. Обычно его размещают на локации-обработчике выделения предмета.

    if $selobj='Апельсин':
        *P 'Вкусный сладкий апельсин. Много нас, а он один.'
    end
    if $selobj = 'Чайник':
        p 'Самый обычный чугунный чайник.'
    end
    ...
    
if $selobj='Отвёртка':
        menu '$screwdriver'
    end
    unsel

VIEW

VIEW — выводит на экран указанное изображение. В классическом плеере изображение выводися в отдельном окошке (окно предпросмотра), в AeroQSP и Quest Navigator изображение выводится верхним слоем в общем окне. Общая запись:

    VIEW [$путь к графическому файлу]

, где [$путь к графическому файлу] — путь к файлу картинки. Если параметр [$путь к графическому файлу] отсутствует, или задан как '' (пустая строка), окно предпросмотра закрывается.

Примеры:

    ! выводим изображение в окне предпросмотра
    view 'content/monster.png'
    ! закрываем окно предпросмотра
    view ''

    ! закрыть окно предпросмотра можно и так
    view

WAIT

WAIT — приостановка выполнения кода программы на указанное количество миллисекунд. Общая запись:

    WAIT [#миллисекунды]

, где [#миллисекунды] — время в миллисекундах, на какое следует остановить выполнение кода программы.

Пример:

    ! остановка выполнения программы на 5 секунд
    wait 5000

Использовать данный оператор необходимо с осторожностью, поскольку приостановка выполнения кода блокирует для игрока возможность взаимодействовать с игрой.

XGOTO (XGT)

XGOTO — переход на указанную локацию без очистки окна основного описания. Общая запись:

    XGOTO [$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8]

, где [$локация] — название локации, на которую должен быть осуществлён переход. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. Использование аргументов не обязательно.

При переходе на новую локацию при помощи xgoto не очищается окно основного описания, а базовое описание новой локации добавляется к уже имеющемуся тексту в окне основного описания. Список действий очищается, затем в окно действий выводятся базовые действия, а так же выполняется код из поля "Выполнить при посещении" локации [$локация]. Так же при переходе на новую локацию изменяется значение, возвращаемое функцией $curloc.

Примеры:

    ! переход на локацию "дом".
    ! Массив args на локации "дом" будет пуст.
    xgoto 'дом'
    ! переход на локацию "улица" с передачей 2-х параметров.
    ! на локации "улица" args[0] равен 1,
    ! $args[1] содержит строку "данные".
    xgoto 'улица',1,'данные'

Оператор имеет краткую форму xgt:

    XGT [$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8]
< Назад, к странице 175
Вперёд, к странице 177 >

Aleks Versus'HowDo-F.A.Q.'2021-2022

Aleks Versus'Game Adventure Making'Really Unimaginable Stories'2013-2022

 

Содержание

1. В чём разница?

1.1. В чём разница между set x=10, let x=10 и x=10?

1.2. В чём разница между переменной со знаком $ и без знака $?

1.3. В чём разница между ' ' (апострофы) и " " (кавычки)?

1.4. В чём разница между *pl "строка" и просто " строка" ?

1.5. Чем отличаются эти две команды? *pl "<<$perem>>" и *pl $perem

1.6. В чём разница между dynamic и dyneval?

1.7. В чём разница между gt и goto?

1.8. Чем отличается goto от gosub?

18.1. Чем отличаются команды addqst и openqst?

Источники и дополнительные материалы

2. Вопросы о $COUNTER

2.1. Как сделать, чтобы значение переменной изменялось с течением времени?

2.2. Как сделать, чтобы из одной локации меня через пару секунд перебрасывало в другую локацию?

2.3. Как сделать, чтобы через пару секунд после входа на локацию появлялось новое действие?

2.4. Как сделать, чтобы цикл выполнялся параллельно остальному коду, а не прерывал его?

Источники и дополнительные материалы

3. Вопросы о MSG и $INPUT

3.1. Как вывести на экран отдельное окошко с текстом? | Подскажите аналог команды alert в QSP.

3.2. Как вывести на экран окошко, в котором игрок должен ввести текст? | Подскажите аналог команды prompt в QSP.

3.3. Как прикрутить возможность выбора варианта к окну msg? | Подскажите аналог команды confirm в QSP.

3.4. Как сделать ввод имени игроком?

3.5. Как увеличить число правильных ответов, которые может ввести игрок? | Как сделать варианты для ответа через $input?

Источники и дополнительные материалы

4. Вопросы о меню

4.1. Как сделать меню предмета?

4.2. Как сделать разные меню для двух и более предметов?

4.3. Как сделать меню в ссылках?

4.4. Как передавать локациям-пунктам меню аргументы?

4.5. Как делать контекстное (динамическое) меню?

4.6. Как вставить разделитель в меню?

4.7. Как вставить картинки в меню?

Источники и дополнительные материалы

5. Вопросы по $ONNEWLOC

5.1. Как сделать так, чтобы не писать один и тот же код в каждой локации?

5.2. Как сделать кнопку "Назад", работающую на каждой локации?

5.3. Почему в args на локации-обработчике перехода на новую локацию уже есть данные?

Источники и дополнительные материалы

6. Вопросы по звуковым файлам в QSP

6.1. Как вставить музыку или звук в игру?

6.2. Как запустить две звуковые дорожки?

6.3. Как при переходе на новую локацию прервать одну мелодию и запустить другую?

6.4. Как перезапустить звуковую дорожку?

6.5. Как приглушить музыку?

6.6. Как зациклить мелодию?

Источники и дополнительные материалы

7. Вопросы о гиперссылках

7.1. Как делать гиперссылки, по нажатию на которые выполняется код? | Как делать кликабельный текст? | Как сделать, чтобы по нажатию на текст что-то происходило?

7.2. Как менять цвет гиперссылки?

7.3. Как помещать в гиперссылки сложный код?

7.4. Как сделать гиперссылки без подчёркивания?

Источники и дополнительные материалы

8. Есть ли команда...

8.1. Какой командой можно очистить окно дополнительного описания?

8.2. Существует ли команда для того, чтобы получить название текущей локации?

8.3. Какой командой можно вывести текст в окно дополнительного описания?

8.4. Есть ли команда, которая делает выход из игры?

Источники и дополнительные материалы

9. Вопросы о изображениях

9.1. Как вставить картинку в игру?

9.2. Можно ли вставить в игру gif-файл?

9.3. Как вставить картинку в действие?

9.4. Как поставить картинку фоном?

9.5. Как выводить изображения послойно? Накладывать друг на друга?

9.6. Как сделать кликабельное изображение? | Как сделать так, чтобы при щелчке по изображению выполнялись какие-то действия?

9.7. Как сделать сменяемое изображение на локации?

9.8. Как сделать вывод рандомного изображения?

Источники и дополнительные материалы

10. Интерфейс, дизайн, украшения

10.1. Для чего нужен оператор REFINT, и как он работает?

10.2. Как изменить цвет фона в игре?

10.3. Как изменить формат части текста? Размер, цвет, наклон и т.д.?

10.4. Как сделать красивый фон в классическом плеере?

10.5. Хочу, чтоб в игре окна располагались определённым образом. Как это сделать?

10.6. Можно ли задавать размер окон из кода игры? Чтобы в одной локации были одни настройки, в другой — другие.

10.7. Настроил расположение окна предпросмотра, но когда выключаю его, другие окна смещаются, как это исправить?

10.8. Как изменить цвет подсветки действий?

10.9. Как изменить цвет фона для отдельного окна?

10.10. Как сделать плавное появление текста? | Как сделать плавное изменение цвета фона? | Как сделать плавное изменение цвета текста?

10.11. Как использовать в игре собственный шрифт?

10.12. С предметов можно снимать выделение, а можно ли снять выделение с действия?

Источники и дополнительные материалы

11. Вопросы об условиях

11.1. При проверке условия записано просто число, без операции сравнения, но QSP не выдаёт ошибку. Почему?

11.2. Как сделать так, чтобы действие появлялось только при определённом условии?

11.3. Видел в одной из игр, как после нажатия на действие, оно становится неактивным. Как это сделать?

11.4. Как добавить текст, который будет выводиться только при выполнении определённого условия?

11.5. Как сделать, чтобы в диалоговом окне текст набирался в зависимости от условий? Чтобы при срабатывании одного или обоих условий текст в любом случае выводился? Логическое ИЛИ (OR).

11.6. Как упростить условие с логическим И (AND)?

11.7. Как упростить взаимоисключающие условия? Логическое XOR.

Источники и дополнительные материалы

12. Вопросы о DYNAMIC

12.1. Зачем нужен оператор dynamic?

12.2. Можно ли сделать переменную с рандомным (случайным) названием?

12.3. Создаю действия с помощью цикла, но они работают неправильно. Что делать?

12.4. Почему не работает dynamic?

Источники и дополнительные материалы

13. Не работает...

13.1. Рисую таблицу и хочу зафиксировать высоту, но атрибут height не работает.

13.2. Пытаюсь использовать разные HTML-теги в игре, но они не работают — просто не выводятся. Почему?

13.3. Не работает IIF!

13.4. Пытаюсь сделать кликабельную картинку с помощью тегов MAP и AREA, но ничего не получается. | Не выводится картинка, не работает область клика, область клика смещена.

13.5. Не работает *pl в действии с goto.

13.6. В AeroQSP не работает атрибут.

13.7. Не работает гиперссылка в AeroQSP.

13.8. Не работает оператор JUMP — не может найти метку.

13.9. Не работает многострочный код. Как исправить?

13.10. Не работает многострочный код. Как исправить?

13.11. Сколько END`ов нужно добавить?

13.12. Не работает условие. Как исправить? (if skrom>10 and <15)

13.13. Не работают десятичные дроби, дробные числа, числа с запятыми!

Источники и дополнительные материалы

14. Вопросы о предметах

14.1. Как добавить предмет в окно предметов?

14.2. Как удалить предмет из окна предметов?

14.3. Как удалить все предметы?

14.4. Как добавить предмет в определённую позицию в окне предметов?

14.5. Как заменить один предмет на другой?

14.6. Как делать динамические/считаемые предметы? | Как делать стакающиеся предметы? | Как делать предметы рядом с названиями которых выводится их количество?

14.7. Как добавить предмет с картинкой но без названия?

14.8. Как сделать, чтоб при щелчке по предмету выполнялся какой-либо код?

14.9. Как снять выделение предмета? | Как сделать, чтобы выбранный предмет можно было кликнуть ещё раз?

14.10. Как сделать два списка предметов? Например для игры за разных персонажей.

14.11. Как сделать, чтобы плеер выполнял определённый код при добавлении любого предмета?

14.12. Как сделать два разных предмета с одинаковыми названиями?

14.13. Как сделать многоуровневый рюкзак? | Как сделать предметы в предметах?

14.14. Можно ли выводить предметы не в окне предметов?

Источники и дополнительные материалы

15. Вопросы о строке ввода

15.1. Зачем вообще нужна строка ввода (поле ввода)?

15.2. Как задействовать строку ввода в игре?

Источники и дополнительные материалы

16. Вопросы по вёрстке

16.1. Можно ли писать текст поверх вставленной картинки (не бэкграунда)?

16.2. Возможно ли сделать плавный переход между локациями?

16.3. Как расположить картинку справа, а текст слева?

16.4. Как ограничить размер выводимого изображения?

16.5. Как сделать рамку окна основного описания? | Как сделать, чтобы картинки шли по контуру основного окна?

16.6. Как сделать вывод предметов магазина не длинным списком, а в виде таблицы?

16.7. Можно ли зеркально отразить картинку методами плеера? | Можно ли задать максимальную или минимальную ширину элементу? | Можно ли вычислить доступное место в основном окне?

16.8. Вывожу в окно табличку, а потом текст, но между текстом и табличкой возникают пустые строки. Что это и как этого избежать?

16.9. Можно как нибудь вывести текст в два столба в классике? К примеру характеристики персонажей.

16.10. Как работать с тегами MAP и AREA? Как разметить картинку на кликабельные зоны?

Источники и дополнительные материалы

17. Вопросы о сохранениях

17.1. Как запретить игроку самостоятельно сохранять игру?

17.2. Во время теста игры делал сохранения, затем внёс в игру несколько правок, но сохранения перестали загружаться. Почему так происходит, и что теперь делать?

17.3. Как сделать чекпойнты в игре?

17.4. Как написать действие, которое при каждом клике сохраняло бы игру в файлы "1.sav" и "2.sav" поочерёдно?

Источники и дополнительные материалы

18. Вопросы о файлах и модулях

18.1. Чем отличаются команды addqst и openqst?

18.2. Как сделать лаунчер?

18.3. Мне нужно узнать, есть ли в папке файл (картинка, музыка и т.д.). Как это сделать?

18.4. Перенёс файл игры из одной папки в другую. В Quest Generator пропали все папки. Почему так происходит, и как этого избежать?

18.5. В папке с игрой стали появляться файлы с расширением .tmp. Что это за файлы, нужны они, и как избавиться от их появления?

Источники и дополнительные материалы

19. Изыски

19.1. Как использовать ASCII-графику в QSP?

19.2. Как вставить в игру видео?

19.3. Как сделать так, чтобы текст появлялся на экране постепенно? По буквам?

19.4. Как защитить игру от чита?

19.5. Как задействовать клавиатуру в игре?

19.6. Как пропустить прохождение нескольких глав, чтобы протестировать вновь написанную главу и только её?

19.7. Как из под плеера выполнить произвольную строку кода?

19.8. Как узнать, на каком устройстве запущена игра? Телефон, компьютер, планшет?

19.9. Как обновлять переменные на экране?

19.10. Как сделать, чтобы текст выводился снизу вверх?

Источники и дополнительные материалы

20. Конкретные задачи

20.1. Как сделать возврат на предыдущую локацию?

20.2. Как проверить число на чётность?

20.3. Как сделать шанс на выпадение определённой вещи? Например 25 процентный шанс на то, что в сундуке окажется золотая чаша?

20.4. Как сделать, чтобы текст выводился не внизу окна основного описания, а сверху?

20.5. Как можно удалить часть текста из описания?

20.6. Как вывести на экран HTML-разметку, не отключая режим распознавания HTML? То есть при usehtml=1.

20.7. Есть несколько переменных с разными значениями. Как получить имя переменной, в которой находится наибольшее значение?

20.8. Как в QSP сравнить два массива?

20.9. Как сделать вытягивание случайных карт из колоды? Карты вытягиваются несколько раз, но они не должны повторяться.

20.10. Как отсортировать данные? Например, список персонажей по алфавиту, или набор чисел от меньшего к большему.

20.11. Как сделать проценты?

20.12. Как решить задачу по поиску случайного набора слагаемых?

20.13. Как разредить текст пробелами?

20.14. Как сделать записную книжку в игре?

20.15. Как сделать так, чтобы на локацию можно было зайти только один раз?

20.16. Как заставить действия выводиться в нужном мне порядке?

20.17. Как сделать в игре книгу? Чтобы её можно было взять и потом прочитать?

20.18. Как сделать склад, сундук, тайник, место, в котором можно выкладывать и хранить предметы?

20.19. Как сделать выпадение случайного действия на локации?

20.20. Как сделать перемещение на случайную локацию?

20.21. Как сделать случайный предмет?

20.22. Как узнать, какие переменные есть в игре? Может для этого есть специальная команда?

20.23. Как убрать преформатирование из HTML-разметки?

Источники и дополнительные материалы

21. Вопросы по Quest Generator (v.4.0.0.Beta)

21.1. Мне часто приходится вставлять одинаковые или почти одинаковые кусочки кода. Как автоматизировать этот процесс?

21.2. Делаю преформатирование пробелами, чтобы появлялась вертикальная полоска, так нагляднее. Нет ли какой-то комбинации клавиш, чтобы не тыкать пробел по пять раз?

21.3. Как свернуть кусочек кода, написанный под комментарием? В идеале, чтоб остался один только комментарий.

Источники и дополнительные материалы

22. Вопросы о Quest Navigator (v.0.0.28)

22.1. Пишу несколько игр в Quest Navigator. Как сделать, чтобы у каждой игры было собственное оформление?

22.2. Как подключить свой шрифт к игре?

22.3. Пишу <strong>bcolor=rgb(255,200,200)</strong>, но это не меняет цвет фона игры. Как изменить цвет фона из кода QSP?

22.4. Хочу прописать игре собственный вид курсора, как это сделать?

22.5. Скопировал шаблон оформления в папку со своей игрой, но что с ним теперь делать? Не пойму, что за что отвечает.

22.6. Как узнать, на каком плеере запущена игра, на классическом QSP, или на Quest Navigator?

22.7. Как вставить видео в игру на Навигаторе?

22.8. Как делать standalone-сборку на Навигаторе? | Независимая сборка на Quest Navigator

22.9. Где в Quest Navigator править размер окна с игрой? Например мне надо, чтобы игра изначально открывалась в разрешении 1280х720.

22.10. Как выполнить JavaScript прямо из кода QSP?

22.11. Инструкция посмене оформления из кода QSP?

Источники и дополнительные материалы

23. Ограничения

23.1. Видел в справке ограничение на 100 подключаемых файлов? Это что, я не смогу использовать более ста файлов картинок и музыки?

23.2. Хочу разместить на локации около 100 действий. Это вообще возможно?

23.3. Генерирую переменные с помощью оператора dynamic, и вдруг выходит ошибка 123. Что это, и как с этим бороться?

Источники и дополнительные материалы

24. Вопросы по работе с плеерами

24.1. Как сделать так, чтобы AeroQSP запускался прямо из Quest Generator?

24.2. Как сделать StandAlone-сборку на классическом плеере? | Можно ли сделать игру так, чтобы играть без плеера? | Как сделать пакетный файл запуска, чтобы игрок тыкал иконку start и сразу начинал играть?

Источники и дополнительные материалы

Зарезервированные слова, системные переменные, спецсимволы

Операции

Операторы

Функции

Системные переменные

Иные синтаксемы

Алфавитный указатель ключевых слов, спецсимволов, синтаксем

Источники и дополнительные материалы